package juanca.mole;

import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;

import com.savagelook.android.JsonHelper;

import ClasesExtras.AdaptadorZonasLavadas;
import ClasesExtras.GetIpAddress;
import ClasesExtras.ItemZonasLavadas;
import ClasesExtras.handlerAlertMessage;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

public class ZonaLavadoCalidad extends Activity {

	private String codigoVerifica;
	private String idNotificacion;
	private String valCodigoVerifica;
	private TextView tvVacioZonasLav;
	private TextView tvVacioZonasLavPartes;
	private ListView lvZonasLavadas;
	private ListView lvZoPartLavadas;
	private EditText etCodVerific;
	private String URL_EMPLEADOS;
	private String URL_ZONAS_LAVADAS;
	private String URL_REGISTRO_ZONAS_LAVADAS;
	public ArrayList<ItemZonasLavadas> lista_zonas = new ArrayList<ItemZonasLavadas>();
	public ArrayList<String> listaDetalles = new ArrayList<String>();
	public String MatrizEmpleados[][];
	public ZonaLavadoCalidad self = this;
	public AdaptadorZonasLavadas adaptador;
	public JSONArray jsonZonasLavadas;
	public String ListaZonasDetalle[][];
	public int Position;
	public handlerAlertMessage mensajeAlerta = new handlerAlertMessage();
	public static final String STRING_EMPTY = "";
	public ProgressDialog progressDialog;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_zona_lavado_calidad);

		getWindow().setSoftInputMode(
				WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

		tvVacioZonasLav = (TextView) findViewById(R.id.tvVacioZonasLav);
		tvVacioZonasLavPartes = (TextView) findViewById(R.id.tvVacioZonasLavPartes);
		lvZonasLavadas = (ListView) findViewById(R.id.lvZonasLavadas);
		lvZoPartLavadas = (ListView) findViewById(R.id.lvZoPartLavadas);
		etCodVerific = (EditText) findViewById(R.id.etCodVerific);
	}

	@Override
	protected void onStart() {
		super.onStart();

		GetIpAddress direccion = new GetIpAddress(this);

		if (direccion.getDireccion() != null) {

			URL_EMPLEADOS = direccion.getDireccion() + "/empleados.json";
			URL_ZONAS_LAVADAS = direccion.getDireccion()
					+ "/zonas_lavado_sin_verificar.json";
			ListaZonasDetalle = new String[9][3];

			ListaZonasDetalle[0][0] = "puertas";
			ListaZonasDetalle[1][0] = "paredes";
			ListaZonasDetalle[2][0] = "piso";
			ListaZonasDetalle[3][0] = "tanque_lavado";
			ListaZonasDetalle[4][0] = "tanque_desinfect";
			ListaZonasDetalle[5][0] = "rejilla";
			ListaZonasDetalle[6][0] = "canal_desague";
			ListaZonasDetalle[7][0] = "cortinas";
			ListaZonasDetalle[8][0] = "soporte_desinfec";

			ListaZonasDetalle[0][1] = "false";
			ListaZonasDetalle[1][1] = "false";
			ListaZonasDetalle[2][1] = "false";
			ListaZonasDetalle[3][1] = "false";
			ListaZonasDetalle[4][1] = "false";
			ListaZonasDetalle[5][1] = "false";
			ListaZonasDetalle[6][1] = "false";
			ListaZonasDetalle[7][1] = "false";
			ListaZonasDetalle[8][1] = "false";

			ListaZonasDetalle[0][2] = "Puertas";
			ListaZonasDetalle[1][2] = "Paredes";
			ListaZonasDetalle[2][2] = "Piso";
			ListaZonasDetalle[3][2] = "Tanque lavado";
			ListaZonasDetalle[4][2] = "Tanque desinfectante";
			ListaZonasDetalle[5][2] = "Rejilla";
			ListaZonasDetalle[6][2] = "Canal_desague";
			ListaZonasDetalle[7][2] = "Cortinas";
			ListaZonasDetalle[8][2] = "Soporte desinfectante";
			final ProgressDialog pd = ProgressDialog.show(this, null,
					this.getString(R.string.PbMsjCargando), true, true);

			new Thread(new Runnable() {
				@Override
				public void run() {
					if (self.lista_zonas.isEmpty()) {
						self.mostrarNotificaciones(URL_ZONAS_LAVADAS,
								URL_EMPLEADOS);
						Log.e("ZonasLavadoCalidad",
								"termina de cargar las zonas a validar");
					} else {
						self.lista_zonas.clear();
						self.mostrarNotificaciones(URL_ZONAS_LAVADAS,
								URL_EMPLEADOS);
						Log.e("ZonasLavadoCalidad",
								"termina de cargar las zonas a validar");
					}
					pd.dismiss();
				}
			}).start();
		}
	}

	@Override
	protected void onResume() {
		super.onResume();

		Bundle bundle = new Bundle();
		bundle = getIntent().getExtras();

		if (bundle != null) {
			String cod = bundle.getString("codigo_verifica");
			this.setValCodigoVerifica(cod);
			Log.i("codigo_zonaLavadoCalidad", cod);
		}
	}

	/**
	 * @return the valCodigoVerifica
	 */
	public String getValCodigoVerifica() {
		return valCodigoVerifica;
	}

	/**
	 * @param valCodigoVerifica
	 *            the valCodigoVerifica to set
	 */
	public void setValCodigoVerifica(String valCodigoVerifica) {
		this.valCodigoVerifica = valCodigoVerifica;
	}

	/**
	 * @return the codigoVerifica
	 */
	public String getCodigoVerifica() {
		return codigoVerifica;
	}

	/**
	 * @param codigoVerifica
	 *            the codigoVerifica to set
	 */
	public void setCodigoVerifica(String codigoVerifica) {
		this.codigoVerifica = codigoVerifica;
	}

	/**
	 * @return the idNotificacion
	 */
	public String getIdNotificacion() {
		return idNotificacion;
	}

	/**
	 * @param idNotificacion
	 *            the idNotificacion to set
	 */
	public void setIdNotificacion(String idNotificacion) {
		this.idNotificacion = idNotificacion;
	}

	/* Metodo de mostrar el listado de notificaciones */
	public void mostrarNotificaciones(String UrlZonasLavadas,
			String UrlEmpleados) {
		adaptador = new AdaptadorZonasLavadas(this, lista_zonas);
		try {
			JSONArray JsonEmpleados = JsonHelper
					.getJsonArrayFromUrl(UrlEmpleados);
			JSONObject ObjetEmpleado = new JSONObject();
			MatrizEmpleados = new String[JsonEmpleados.length()][2];
			for (int i = 0; i <= JsonEmpleados.length() - 1; i++) {
				ObjetEmpleado = JsonEmpleados.getJSONObject(i);
				MatrizEmpleados[i][0] = ObjetEmpleado.getString("id");
				MatrizEmpleados[i][1] = ObjetEmpleado.getString("nombre");

			}

		} catch (Exception e) {
			Log.i("ZonasLavadoCalidad", e.fillInStackTrace().toString());
		}

		try {
			JSONArray ZonasLavadas = JsonHelper
					.getJsonArrayFromUrl(UrlZonasLavadas);
			jsonZonasLavadas = ZonasLavadas;

			JSONObject Objet = new JSONObject();
			for (int i = 0; i <= ZonasLavadas.length() - 1; i++) {
				Objet = ZonasLavadas.getJSONObject(i);
				if (Objet.getString("codigo_verifica").equals("null")
						|| Objet.getString("codigo_verifica").equals("")) {
					String id = Objet.getString("id");
					String idEmpleado = Objet.getString("empleado_id");
					String fecha = Objet.getString("created_at");
					for (int j = 0; j < MatrizEmpleados.length; j++) {
						if (MatrizEmpleados[j][0].equals(idEmpleado)) {
							String nombre = MatrizEmpleados[j][1];
							lista_zonas.add(new ItemZonasLavadas(id, nombre,
									fecha));
						}

					}

				}

			}

			// correr en un nuevo hilo la UI
			runOnUiThread(new Runnable() {
				@Override
				public void run() {
					if (self.lista_zonas.isEmpty()) {
						tvVacioZonasLav.setText(R.string.msjSinNotifica);

						Log.w("ZonasLavadoCalidad",
								"no hay Notificaciones de lavado");
					} else {

						for (int i = 0; i < lista_zonas.size(); i++) {
							Log.i("ZonasLavadoCalidad", lista_zonas.get(i)
									.getId().toString()
									+ " "
									+ lista_zonas.get(i).getNombre().toString()
									+ " "
									+ lista_zonas.get(i).getFecha().toString());
						}

						self.adaptador = new AdaptadorZonasLavadas(self,
								self.lista_zonas);
						lvZonasLavadas.setAdapter(adaptador);
						lvZonasLavadas.setDividerHeight(1);

						Log.i("ZonasLavadoCalidad", "listó las Notificaciones");
					}
				}
			});

			// Se le aplica un Listener donde ira lo que tiene que hacer en caso
			// de
			// que sea pulsado
			lvZonasLavadas.setOnItemClickListener(new OnItemClickListener() {
				public void onItemClick(AdapterView<?> parent, View v,
						int position, long arg3) {

					String IdLavado = lista_zonas.get(position).getId();
					self.setIdNotificacion(IdLavado);
					Position = position;
					if (listaDetalles.isEmpty()) {
						self.mostrarDetallesZona(IdLavado);
					} else {

						listaDetalles.clear();
						self.mostrarDetallesZona(IdLavado);
					}

					adaptador.notifyDataSetChanged();

				}
			});

		} catch (Exception e) {
			Log.e("ZonasLavadoCalidad", e.fillInStackTrace().toString());

			/*
			 * hilo que muestra el mensaje de error de conexion al cargar los
			 * datos
			 */
			runOnUiThread(new Runnable() {
				public void run() {

					AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
							self);
					mensajeEmergente.setTitle(R.string.tituloError);
					mensajeEmergente
							.setMessage(R.string.msjSinCargarNotificaLav);
					mensajeEmergente.setNeutralButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {

								public void onClick(DialogInterface dialog,
										int which) {
									ZonaLavadoCalidad.this.finish();

								}
							});

					mensajeEmergente.create();
					mensajeEmergente.show();
				}
			});
		}

	}

	/* Metodo que muestra las zonas que lavó el empleado seleccionado */
	public void mostrarDetallesZona(String id) {
		try {

			JSONObject Objet = new JSONObject();
			JSONObject ObjetResul = new JSONObject();
			for (int i = 0; i <= jsonZonasLavadas.length() - 1; i++) {
				Objet = jsonZonasLavadas.getJSONObject(i);
				if (Objet.getString("id").equals(id)) {

					ObjetResul = Objet;

				}
			}

			for (int i = 0; i < ListaZonasDetalle.length; i++) {

				ListaZonasDetalle[i][1] = ObjetResul
						.getString(ListaZonasDetalle[i][0]);

			}
			for (int i = 0; i < ListaZonasDetalle.length; i++) {

				if (ListaZonasDetalle[i][1] == "true") {
					listaDetalles.add(ListaZonasDetalle[i][2]);

				}
			}
			ArrayAdapter<String> adaptadorPartes = new ArrayAdapter<String>(
					this, android.R.layout.simple_list_item_1, listaDetalles);

			if (listaDetalles.isEmpty()) {
				tvVacioZonasLavPartes.setText(R.string.msjSinNotificaDetalles);
			} else {
				tvVacioZonasLavPartes.setText("");
				lvZoPartLavadas.setAdapter(adaptadorPartes);
			}

		} catch (Exception e) {
			Log.i("ZonasLavadoCalidad", e.fillInStackTrace().toString());
			/*
			 * hilo que muestra el mensaje de error de conexion al cargar los
			 * datos
			 */
			runOnUiThread(new Runnable() {
				public void run() {

					AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
							self);
					mensajeEmergente.setTitle(R.string.tituloError);
					mensajeEmergente
							.setMessage(R.string.msjSinCargarNotificaLav);
					mensajeEmergente.setNeutralButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {

								public void onClick(DialogInterface dialog,
										int which) {
									ZonaLavadoCalidad.this.finish();

								}
							});

					mensajeEmergente.create();
					mensajeEmergente.show();
				}
			});
		}

	}

	/*
	 * Metodo que elimina un item de la lista de notificaciones
	 */
	public void removerItemListaZonas(int positionItem) {
		ItemZonasLavadas item = adaptador.getItem(positionItem);
		adaptador.remove(item);
		adaptador.notifyDataSetChanged();
		if (self.lista_zonas.isEmpty()) {
			tvVacioZonasLav.setText(R.string.msjSinNotifica);
			Log.w("ZonasLavadoCalidad", "no hay Notificaciones");
		}
	}

	public void validar() {
		if (this.getIdNotificacion() != null) {
			if (!this.getCodigoVerifica().equals(STRING_EMPTY)) {

				if (this.getCodigoVerifica()
						.equals(this.getValCodigoVerifica())) {
					progressDialog = new ProgressDialog(self);
					progressDialog.setMessage(self
							.getString(R.string.PbMsjEnviando));
					progressDialog.setCancelable(true);
					progressDialog.show();

					new Thread(new Runnable() {
						@Override
						public void run() {
							self.enviarDatos();

						}
					}).start();

				} else {

					// el codigo deverificacion no pertenece a un Usuario de rol
					// calidad
					Log.e("ZonasLavado_Afue_Calidad",
							"Codigo de verificacion invalido, no existe");
					new AlertDialog.Builder(self)
							.setIcon(android.R.drawable.ic_dialog_alert)
							.setTitle(R.string.tituloAlerta)
							.setMessage(R.string.msjERCodigoVerificaIncorrecto)
							.setPositiveButton(R.string.btnAceptar, null)
							.show();
				}

			} else {
				// mensaje.. ingrese codigo de verificacion
				Log.e("ZonasLavadoCalidad", "No ingresa codigo de verificacion");
				new AlertDialog.Builder(self)
						.setIcon(android.R.drawable.ic_dialog_alert)
						.setTitle(R.string.tituloAlerta)
						.setMessage(R.string.msjSinCodigoVerifica)
						.setPositiveButton(R.string.btnAceptar, null).show();

			}

		} else {
			// mensaje.. seleccione una notificacion
			Log.e("ZonasLavadoCalidad", "No selecciona una notificacion");
			new AlertDialog.Builder(self)
					.setIcon(android.R.drawable.ic_dialog_alert)
					.setTitle(R.string.tituloAlerta)
					.setMessage(R.string.msjSinNotificaSelected)
					.setPositiveButton(R.string.btnAceptar, null).show();
		}

	}

	/* Metodo del boton registrar validacion */
	public void registrarCodigoValiLav(View v) {

		this.setCodigoVerifica(this.etCodVerific.getText().toString());
		this.validar();

	}

	/* Metodo que envia los datos */
	public void enviarDatos() {
		GetIpAddress direccion = new GetIpAddress(this);
		URL_REGISTRO_ZONAS_LAVADAS = direccion.getDireccion()
				+ "/zonas_lavado/" + this.getIdNotificacion() + ".json";
		HttpClient httpClient = new DefaultHttpClient();
		HttpPut put = new HttpPut(URL_REGISTRO_ZONAS_LAVADAS);
		try {
			JSONObject dato = new JSONObject();
			dato.put("codigo_verifica", this.getCodigoVerifica());
			StringEntity entity1 = new StringEntity(dato.toString());
			put.setHeader("Content-Type", "application/json; chartset=UTF-8");
			put.setEntity(entity1);
			HttpResponse resp = httpClient.execute(put);
			final String respStr = EntityUtils.toString(resp.getEntity());
			Log.w("ZonasLavadoCalidad", respStr.toString());
			if (respStr.equals("true")) {

				runOnUiThread(new Runnable() {
					public void run() {
						self.removerItemListaZonas(Position);
						self.listaDetalles.clear();
						self.setIdNotificacion(null);
						self.tvVacioZonasLavPartes
								.setText(R.string.msjSinNotificaDetalles2);
						self.etCodVerific.setText(STRING_EMPTY);

						progressDialog.dismiss();
						new AlertDialog.Builder(self)
								.setIcon(
										android.R.drawable.checkbox_on_background)
								.setTitle(R.string.msjMuyBien)
								.setMessage(R.string.msjRegistroAbalLavado)
								.setPositiveButton(R.string.btnAceptar, null)
								.show();

					}
				});
			} else {

				runOnUiThread(new Runnable() {
					public void run() {

						progressDialog.dismiss();
						new AlertDialog.Builder(self)
								.setIcon(android.R.drawable.ic_dialog_alert)
								.setTitle(R.string.tituloError)
								.setMessage(R.string.msjErNoRetornaTrue)
								.setPositiveButton(R.string.btnAceptar, null)
								.show();

					}
				});
			}

		} catch (Exception e) {
			Log.e("ZonasLavadoCalidad", e.fillInStackTrace().toString());
			runOnUiThread(new Runnable() {
				public void run() {
					progressDialog.dismiss();
					mensajeAlerta.alertMessageOneButton(self,
							R.string.tituloError, R.string.msjERConexionEnviar,
							R.string.btnAceptar);

				}
			});
		}

	}

}
